﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ASPMVCUtil.Helpers.Html.Grid
{
    /// <summary>
    /// Clase genérica que permite manejar una lista paginada para un grid
    /// </summary>
    /// <typeparam name="TModel"></typeparam>
    public class GridPagedList<TModel> : List<TModel>
    {
        /// <summary>
        /// Pagina que debe tomarse
        /// </summary>
        public int CurrentPage { get; private set; }
        /// <summary>
        /// Cantidad de registros por página
        /// </summary>
        public int PageSize { get; private set; }
        /// <summary>
        /// Número total de registros en la fuente de datos
        /// </summary>
        public int Total { get; private set; }
        /// <summary>
        /// Número total de páginas
        /// </summary>
        public int TotalPages { get; private set; }
        /// <summary>
        /// Nombre de la propiedad de los nombres de las propiedas de la llave compuesta
        /// </summary>
        public string[] KeyMembersNames { get; private set; }
        /// <summary>
        /// Parámetros del grid
        /// </summary>
        public GridParams GridParams { get; private set; }

        /// <summary>
        /// Construye una lista pagina para un grid a partir de una fuente de datos, los parámetros del grid y el tamaño de página
        /// </summary>
        /// <param name="source"></param>
        /// <param name="gridParams"></param>
        /// <param name="pageSize">Opcinal. Si no se especifica o se envía 0, el tamaño de página será igual al total de registros</param>
        public GridPagedList(IEnumerable<TModel> source, GridParams gridParams, string[] keyMembersNames, int pageSize = 0)
        {
            CurrentPage = gridParams.CurrentPage;
            KeyMembersNames = keyMembersNames;
            if (CurrentPage < 1) CurrentPage = 1;
            Total = source.Count();
            PageSize = pageSize;
            GridParams = gridParams;
            if (PageSize == 0)
            {
                //PageSize = Total; no debería hacer eso
                TotalPages = 1;
                this.AddRange(source);
            }
            else
            {
                TotalPages = (int)Math.Ceiling(Total / (double)PageSize);

                this.AddRange(source.Skip((CurrentPage - 1) * PageSize).Take(PageSize));
            }
        }

        /// <summary>
        /// Indica si hay una página anterior a Pagina
        /// </summary>
        public bool HayPaginaAnterior
        {
            get
            {
                return (CurrentPage > 1);
            }
        }

        /// <summary>
        /// Indica si hay una página siguiente a Pagina
        /// </summary>
        public bool HayPaginaSiguiente
        {
            get
            {
                return (CurrentPage < TotalPages);
            }
        }

        /// <summary>
        /// Número del primer registro mostrado
        /// </summary>
        public int RegistroInicio
        {
            get
            {
                return (CurrentPage - 1) * PageSize + 1;
            }
        }

        /// <summary>
        /// Número del último registro mostrado
        /// </summary>
        public int RegistroFin
        {
            get
            {
                return ((CurrentPage * PageSize) > Total) ? Total : CurrentPage * PageSize;
            }
        }
    }

}